home *** CD-ROM | disk | FTP | other *** search
/ Exame Informatica 139 / Exame Informatica 139.iso / Internet / NVU / chrome / toolkit.jar / content / mozapps / downloads / pref-downloads.js < prev    next >
Encoding:
Text File  |  2004-10-21  |  13.3 KB  |  416 lines

  1.  
  2. var _elementIDs = ["askOnSave", "downloadFolderList", "downloadFolder"];
  3.  
  4. var gLastSelectedIndex = 0;
  5. var gHelperApps = null;
  6.  
  7. var gEditFileHandler, gRemoveFileHandler, gHandlersList;
  8.  
  9. var downloadDirPref = "browser.download.dir"; 
  10. var downloadModePref = "browser.download.folderList";
  11. const nsILocalFile = Components.interfaces.nsILocalFile;
  12.  
  13. function selectFolder()
  14.   const nsIFilePicker = Components.interfaces.nsIFilePicker;
  15.   var fp = Components.classes["@mozilla.org/filepicker;1"]
  16.                       .createInstance(nsIFilePicker);
  17.   var pref = Components.classes["@mozilla.org/preferences-service;1"]
  18.                       .getService(Components.interfaces.nsIPrefBranch);
  19.  
  20.   var bundle = document.getElementById("strings");
  21.   var description = bundle.getString("selectDownloadDir");
  22.   fp.init(window, description, nsIFilePicker.modeGetFolder);
  23.   try 
  24.   {
  25.     var initialDir = pref.getComplexValue(downloadDirPref, nsILocalFile);
  26.     if (initialDir)
  27.       fp.displayDirectory = initialDir;
  28.   }
  29.   catch (ex)
  30.   {
  31.     // ignore exception: file picker will open at default location
  32.   }
  33.   fp.appendFilters(nsIFilePicker.filterAll);
  34.   var ret = fp.show();
  35.  
  36.   if (ret == nsIFilePicker.returnOK) {
  37.     var localFile = fp.file.QueryInterface(nsILocalFile);
  38.     pref.setComplexValue(downloadDirPref, nsILocalFile, localFile)
  39.     selectCustomFolder(true);
  40.   }
  41.   else {
  42.     var folderList = document.getElementById("downloadFolderList");
  43.     folderList.selectedIndex = gLastSelectedIndex;
  44.   }
  45. }
  46.  
  47. function doEnabling(aSelectedItem)
  48. {
  49.   var textbox = document.getElementById("downloadFolderList");
  50.   var button = document.getElementById("showFolder");
  51.   var disable = aSelectedItem.id == "alwaysAsk";
  52.   textbox.disabled = disable;
  53.   button.disabled = disable;
  54. }
  55.  
  56. function Startup() 
  57. {
  58.   var folderList = document.getElementById("downloadFolderList");
  59.   
  60.   const nsILocalFile = Components.interfaces.nsILocalFile;
  61.   var pref = Components.classes["@mozilla.org/preferences-service;1"]
  62.                       .getService(Components.interfaces.nsIPrefBranch);
  63.                       
  64.   try {
  65.     var downloadDir = pref.getComplexValue(downloadDirPref, nsILocalFile);  
  66.     
  67.     var desktop = getDownloadsFolder("Desktop");
  68.     var downloads = getDownloadsFolder("Documents");
  69.     
  70.     // Check to see if the user-entered download dir is actually one of our
  71.     // enumerated values (Desktop, My Downloads) and if so select that
  72.     // item instead of the user selected one. 
  73.     // XXX - It's lame that I should have to compare the path directly. The 
  74.     // win32 implementation of nsIFile should know that Windows is not case 
  75.     // sensitive.
  76.     var downloadPath = downloadDir.path.toUpperCase();
  77.     if (downloadPath == desktop.path.toUpperCase()) {
  78.       pref.clearUserPref(downloadDirPref);
  79.       pref.setIntPref(downloadModePref, 0);
  80.       folderList.selectedIndex = 0;
  81.     }
  82.     else if (downloadPath == downloads.path.toUpperCase()) {
  83.       pref.clearUserPref(downloadDirPref);
  84.       pref.setIntPref(downloadModePref, 1);
  85.       folderList.selectedIndex = 1;
  86.     }
  87.   }
  88.   catch (e) {
  89.   }
  90.   
  91.   try {
  92.     selectCustomFolder(false);
  93.   }
  94.   catch (e) {
  95.   }
  96.   
  97.   gLastSelectedIndex = folderList.selectedIndex;
  98.   
  99.   // Initialize the File Type list
  100.   gHelperApps = new HelperApps();
  101.   
  102.   gHandlersList = document.getElementById("fileHandlersList");
  103.   gHandlersList.database.AddDataSource(gHelperApps);
  104.   gHandlersList.setAttribute("ref", "urn:mimetypes");
  105.   
  106.   (gEditFileHandler = document.getElementById("editFileHandler")).disabled = true;
  107.   (gRemoveFileHandler = document.getElementById("removeFileHandler")).disabled = true;
  108.   
  109.   parent.hPrefWindow.registerOKCallbackFunc(updateSaveToFolder);
  110.   // XXXben such a hack. Should really update the OKCallbackFunction thing a bit to 
  111.   //        let it support holding arbitrary data. 
  112.   parent.hPrefWindow.getSpecialFolderKey = getSpecialFolderKey;
  113.  
  114.   // XXXben menulist hack #43. When initializing the display to the custom
  115.   //        download path field, the field is blank. 
  116.   var downloadFolderList = document.getElementById("downloadFolderList");
  117.   downloadFolderList.parentNode.removeChild(downloadFolderList);
  118.   var showFolder = document.getElementById("showFolder");
  119.   showFolder.parentNode.insertBefore(downloadFolderList, showFolder);
  120.   downloadFolderList.hidden = false;
  121.  
  122.   
  123.   setTimeout(postStart, 0);
  124. }
  125.  
  126. function postStart()
  127. {
  128.   var downloadFolderList = document.getElementById("downloadFolderList");
  129.   downloadFolderList.label = downloadFolderList.selectedItem.label;
  130. }
  131.  
  132. function uninit()
  133. {
  134.   gHandlersList.database.RemoveDataSource(gHelperApps);
  135.   
  136.   gHelperApps.destroy();
  137. }
  138.  
  139. // WARNING WARNING WARNING
  140. // This is a Options OK Callback
  141. // When this function is called the Downloads panel's document object 
  142. // MAY NOT BE AVAILABLE. As a result referring to any item in it in this
  143. // function will probably cause the Options window not to close when OK
  144. // is pressed. 
  145. function updateSaveToFolder()
  146. {
  147.   var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  148.   function getPref(aPrefName, aPrefGetter, aDefVal) 
  149.   {
  150.     try {
  151.       var val = prefs[aPrefGetter](aPrefName);
  152.     }
  153.     catch (e) {
  154.       val = aDefVal;
  155.     }
  156.     return val;                
  157.   }
  158.  
  159.   var defaultFolderPref = "browser.download.defaultFolder";
  160.   var downloadDirPref = "browser.download.dir";
  161.  
  162.   var data = parent.hPrefWindow.wsm.dataManager.pageData["chrome://mozapps/content/downloads/pref-downloads.xul"].elementIDs;
  163.   // Don't let the variable names here fool you. This code executes if the 
  164.   // user chooses to have all files auto-download to a specific folder.
  165.   if (data.askOnSave.value == "true") {
  166.     var fileLocator = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
  167.     
  168.     var bundle = Components.classes["@mozilla.org/intl/stringbundle;1"].getService(Components.interfaces.nsIStringBundleService);
  169.     bundle = bundle.createBundle("chrome://mozapps/locale/downloads/unknownContentType.properties");
  170.     var description = bundle.GetStringFromName("myDownloads");
  171.     var targetFolder = null;
  172.  
  173.     switch (parseInt(data.downloadFolderList.value)) {
  174.     case 1:
  175.       targetFolder = fileLocator.get(parent.hPrefWindow.getSpecialFolderKey("Documents"), 
  176.                                      Components.interfaces.nsIFile);
  177.       targetFolder.append(description);
  178.       break;
  179.     case 2:
  180.       targetFolder = prefs.getComplexValue(downloadDirPref, 
  181.                                            Components.interfaces.nsILocalFile);  
  182.       break;
  183.     case 0:
  184.     default:          
  185.       targetFolder = fileLocator.get(parent.hPrefWindow.getSpecialFolderKey("Desktop"), 
  186.                                       Components.interfaces.nsIFile);
  187.       break;
  188.     }
  189.     prefs.setComplexValue(defaultFolderPref,
  190.                           Components.interfaces.nsILocalFile,
  191.                           targetFolder);
  192.   }
  193.   else if (prefs.prefHasUserValue(defaultFolderPref))
  194.     prefs.clearUserPref(defaultFolderPref);  
  195. }
  196.  
  197. function selectCustomFolder(aShouldSelectItem)
  198. {
  199.   var pref = Components.classes["@mozilla.org/preferences-service;1"]
  200.                       .getService(Components.interfaces.nsIPrefBranch);
  201.   var downloadDir = pref.getComplexValue(downloadDirPref, nsILocalFile);
  202.   
  203.   var folder = document.getElementById("downloadFolder");
  204.   folder.label = downloadDir.path;
  205.   folder.setAttribute("path", downloadDir.path);
  206.   folder.hidden = false;
  207.   
  208.   var folderList = document.getElementById("downloadFolderList");
  209.   if (aShouldSelectItem)
  210.     folderList.selectedIndex = 2;
  211. }
  212.  
  213. function folderListCommand(aEvent)
  214. {
  215.   var folderList = document.getElementById("downloadFolderList");
  216.   if (folderList.selectedItem.getAttribute("value") == 9)
  217.     selectFolder();
  218.   
  219.   var selectedIndex = folderList.selectedIndex;
  220.  
  221.   if (selectedIndex == 1) {
  222.     var downloads = getDownloadsFolder("Documents");
  223.     if (!downloads.exists())
  224.       downloads.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0755);
  225.   }
  226.   
  227.   // folderList.inputField.readonly = (selectedIndex == 0 || selectedIndex == 1);
  228.  
  229.   gLastSelectedIndex = folderList.selectedIndex;
  230. }
  231.  
  232. function showFolder()
  233. {
  234.   var folderList = document.getElementById("downloadFolderList");
  235.  
  236.   var folder = null;
  237.   
  238.   switch (folderList.selectedIndex) {
  239.   case 0:
  240.     folder = getDownloadsFolder("Desktop");
  241.     break;
  242.   case 1:
  243.     folder = getDownloadsFolder("Downloads");
  244.     break;
  245.   case 2:
  246.     var path = document.getElementById("downloadFolder").getAttribute("path");
  247.     folder = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  248.     folder.initWithPath(path);
  249.     break;
  250.   }
  251.  
  252.   try {
  253.     folder.reveal();
  254.   } catch (ex) {
  255.     // if nsILocalFile::Reveal failed (ie it currently just returns an
  256.     // error on unix), send the directory to the system file: handler
  257.  
  258.     var uri = Components.classes["@mozilla.org/network/standard-url;1"]
  259.       .createInstance(Components.interfaces.nsIURI);
  260.     uri.spec = "file:///" + folder.path;
  261.  
  262.     var protocolSvc = Components.classes
  263.       ["@mozilla.org/uriloader/external-protocol-service;1"]
  264.       .getService(Components.interfaces.nsIExternalProtocolService);
  265.     protocolSvc.loadUrl(uri);
  266.   }
  267. }
  268.  
  269. function getSpecialFolderKey(aFolderType) 
  270. {
  271.   return aFolderType == "Desktop" ? "DeskP" : "Pers";
  272.   return "Home";
  273. }
  274.  
  275. function getDownloadsFolder(aFolder)
  276. {
  277.   var fileLocator = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
  278.  
  279.   var dir = fileLocator.get(getSpecialFolderKey(aFolder), Components.interfaces.nsILocalFile);
  280.   var bundle = document.getElementById("strings");
  281.   var description = bundle.getString("myDownloads");
  282.   if (aFolder != "Desktop")
  283.     dir.append(description);
  284.     
  285.   return dir;
  286. }
  287.  
  288. function fileHandlerListSelectionChanged(aEvent)
  289. {
  290.   var selection = gHandlersList.view.selection; 
  291.   var selected = selection.count;
  292.   gRemoveFileHandler.disabled = selected == 0;
  293.   gEditFileHandler.disabled = selected != 1;
  294.   
  295.   var canRemove = true;
  296.   
  297.   var cv = gHandlersList.contentView;
  298.   var rangeCount = selection.getRangeCount();
  299.   var min = { }, max = { };
  300.   for (var i = 0; i < rangeCount; ++i) {
  301.     selection.getRangeAt(i, min, max);
  302.     
  303.     for (var j = min.value; j <= max.value; ++j) {
  304.       var item = cv.getItemAtIndex(j);
  305.       var editable = gHelperApps.getLiteralValue(item.id, "editable") == "true";
  306.       var handleInternal = gHelperApps.getLiteralValue(item.id, "handleInternal");
  307.       
  308.       if (!editable || handleInternal) 
  309.         canRemove = false;
  310.     }
  311.   }
  312.   
  313.   if (!canRemove) {
  314.     gRemoveFileHandler.disabled = true;
  315.     gEditFileHandler.disabled = true;
  316.   }
  317. }
  318.  
  319. function removeFileHandler()
  320. {
  321.   const nsIPS = Components.interfaces.nsIPromptService;
  322.   var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(nsIPS);
  323.   
  324.   var bundle = document.getElementById("strings");
  325.   var title = bundle.getString("removeActions");
  326.   var msg = bundle.getString("removeActionsMsg");
  327.  
  328.   var buttons = (nsIPS.BUTTON_TITLE_YES * nsIPS.BUTTON_POS_0) + (nsIPS.BUTTON_TITLE_NO * nsIPS.BUTTON_POS_1);
  329.  
  330.   if (ps.confirmEx(window, title, msg, buttons, "", "", "", "", { }) == 1) 
  331.     return;
  332.   
  333.   var c = Components.classes["@mozilla.org/rdf/container;1"].createInstance(Components.interfaces.nsIRDFContainer);
  334.   c.Init(gHelperApps, gRDF.GetResource("urn:mimetypes:root"));
  335.   
  336.   var cv = gHandlersList.contentView;
  337.   var selection = gHandlersList.view.selection; 
  338.   var rangeCount = selection.getRangeCount();
  339.   var min = { }, max = { };
  340.   
  341.   var lastAdjacent = -1;
  342.   for (var i = 0; i < rangeCount; ++i) {
  343.     selection.getRangeAt(i, min, max);
  344.     
  345.     if (i == (rangeCount - 1)) { 
  346.       if (min.value >= (gHandlersList.view.rowCount - selection.count)) 
  347.         lastAdjacent = min.value - 1;
  348.       else
  349.         lastAdjacent = min.value;
  350.     }
  351.     
  352.     for (var j = max.value; j >= min.value; --j) {
  353.       var item = cv.getItemAtIndex(j);
  354.       var itemResource = gRDF.GetResource(item.id);
  355.       c.RemoveElement(itemResource, j == min.value);
  356.       
  357.       cleanResource(itemResource);
  358.     }
  359.   }
  360.  
  361.   if (lastAdjacent != -1) {
  362.     selection.select(lastAdjacent);
  363.     gHandlersList.focus();
  364.   }
  365.   
  366.   gHelperApps.flush();
  367. }
  368.  
  369. function cleanResource(aResource)
  370. {
  371.   var handlerProp = gHelperApps.GetTarget(aResource, gHelperApps._handlerPropArc, true);
  372.   if (handlerProp) {
  373.     var extApp = gHelperApps.GetTarget(handlerProp, gHelperApps._externalAppArc, true);
  374.     if (extApp)
  375.       disconnect(extApp);
  376.     disconnect(handlerProp);
  377.   }
  378.   disconnect(aResource);
  379. }
  380.  
  381. function disconnect(aResource)
  382. {
  383.   var arcs = gHelperApps.ArcLabelsOut(aResource);
  384.   while (arcs.hasMoreElements()) {
  385.     var arc = arcs.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  386.     var val = gHelperApps.GetTarget(aResource, arc, true);
  387.     gHelperApps.Unassert(aResource, arc, val, true);
  388.   }
  389. }
  390.  
  391. function editFileHandler()
  392. {
  393.   var selection = gHandlersList.view.selection; 
  394.   
  395.   var cv = gHandlersList.contentView;
  396.   var item = cv.getItemAtIndex(selection.currentIndex);
  397.   var itemResource = gRDF.GetResource(item.id);
  398.   
  399.   openDialog("chrome://mozapps/content/downloads/editAction.xul", "", "modal=yes", itemResource);
  400. }
  401.  
  402. function showPlugins()
  403. {
  404.   openDialog("chrome://browser/content/pref/plugins.xul", "", "modal,resizable");
  405. }
  406.  
  407. function toggleDMPrefUI(aCheckbox)
  408. {
  409.   if (aCheckbox.checked) 
  410.     document.getElementById("closeWhenDone").removeAttribute("disabled");
  411.   else
  412.     document.getElementById("closeWhenDone").setAttribute("disabled", "true");
  413. }
  414.  
  415.